#include <Adafruit_GFX.h>      // 核心图形库
#include <Adafruit_ST7735.h>   // ST7735驱动库
#include <SPI.h>               // SPI通信
#include <Wire.h>              // I2C（用于MPU6050）
#include <MPU6050.h>
#include <TimerOne.h>

#define TFT_CS   10
#define TFT_DC   9
#define TFT_RST  8
#define TFT_BLK  6    // PWM背光控制



Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
MPU6050 mpu;         // 倾角传感器

// 互补滤波器参数
const float alpha = 0.90; // 陀螺仪权重，可以根据实际情况调整
float roll = 0, temp = 0 ,m = 0;

volatile bool sampleFlag = false;
void timerISR()
{
  sampleFlag = true;   // 告诉主循环“该采样了”
}
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  tft.initR(INITR_BLACKTAB);  // 初始化屏幕
  tft.setRotation(0);         // 屏幕方向（0-3可选）
  analogWrite(TFT_BLK, 255);  // 背光最亮

  Wire.begin();

  tft.fillScreen(ST7735_BLUE);
  tft.setTextColor(ST7735_WHITE);
  tft.setTextSize(1);

  // 绘制静态部分（如仪表盘框架）
  tft.drawRect(10, 10, 108, 60, ST7735_WHITE);  // 仪表盘外框
   tft.drawRect(10, 80, 108, 70, ST7735_WHITE);  // 仪表盘外框

  mpu.initialize();
  if (mpu.testConnection()) {
    Serial.println("MPU6050 connection successful");
  } else {
    Serial.println("MPU6050 connection failed");
  }

  Timer1.initialize(10000);      // 10 ms → 100 Hz
  Timer1.attachInterrupt(timerISR);
}

// 中断服务函数
void readSensors()
{
  int16_t ax, ay, az;
  int16_t gx, gy, gz;
  mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

  float accRoll  = atan2(ax, az) * 180 / PI;
  float gyroRoll = gx / 131.0;

  roll = alpha * (roll + gyroRoll * 0.01) + (1 - alpha) * accRoll;

   if (abs(roll)>m){
    m = abs(roll); 
  }

  int16_t rawTemp = mpu.getTemperature();
  temp = rawTemp / 340.0 + 36.53;
}

void loop() {
  
  static uint32_t lastScreen = 0;
  if (sampleFlag) {              // 每 10 ms 进来一次
    sampleFlag = false;
    readSensors();               // 真正读取，安全
  }

  // 屏幕刷新不需要 100 Hz，降到 10 Hz 足够
  if (millis() - lastScreen >= 1000) {
    lastScreen = millis();

 

  // 4. 显示倾角（模拟指针式仪表）
  tft.fillRect(15, 15, 100, 10, ST7735_BLUE);
  tft.setCursor(15, 15);
  tft.print("roll: ");
  tft.print(roll, 2);  // 显示X轴倾角（保留1位小数）
  
  tft.fillRect(11, 81, 106, 68, ST7735_BLACK);
  drawPointer(roll);

 

  tft.fillRect(15, 32, 100, 10, ST7735_BLUE);
  tft.setCursor(15, 32);
  tft.print("Max: ");
  tft.print(m, 2);

  // 5. 显示温度（数字+模拟条）
  tft.fillRect(15, 50, 100, 10, ST7735_BLUE);
  tft.setCursor(15, 50);
  tft.print("Temp: ");
  tft.print(temp, 1);
  tft.print(" C");
 // tft.fillRect(15, 70, map(temp, 0, 50, 0, 100), 10, ST7735_RED); // 温度条

  }
}

// 矩形参数
const int rectX = 10;
const int rectY = 80;
const int rectWidth = 108;
const int rectHeight = 80;

// 指针参数
const int pointerLength = 40;
const int centerX = rectX + rectWidth / 2;
const int centerY = rectY + rectHeight / 2+20;


void drawPointer(float angle) {
  // 计算指针终点坐标
  int endX = centerX + pointerLength * sin(radians(angle));
  int endY = centerY - pointerLength * cos(radians(angle));

  // 清除旧的指针
  //tft.drawLine(centerX, centerY, centerX + pointerLength * sin(radians(angle - 10)), centerY - pointerLength * cos(radians(angle - 10)), ST7735_BLACK);

  tft.drawLine(64, 80, 64,85, ST7735_WHITE);
  // 绘制新的指针
  tft.drawLine(centerX, centerY, endX, endY, ST7735_RED);
  tft.setCursor(62, 90);
  tft.print("0");
}
